﻿using UnityEditor;
using UnityEngine;

namespace Obi
{

    [CustomEditor(typeof(ObiColliderBase), true), CanEditMultipleObjects]
    public class ObiColliderEditor : Editor
    {

        ObiColliderBase collider;
        SerializedProperty collisionFilter;

        public void OnEnable()
        {
            collider = (ObiColliderBase)target;
            collisionFilter = serializedObject.FindProperty("filter");
        }

        protected void NonReadableMeshWarning(Mesh mesh)
        {
            EditorGUILayout.BeginVertical(EditorStyles.helpBox);
            Texture2D icon = EditorGUIUtility.Load("icons/console.erroricon.png") as Texture2D;
            EditorGUILayout.LabelField(new GUIContent("The input mesh is not readable. Read/Write must be enabled in the mesh import settings.", icon), EditorStyles.wordWrappedMiniLabel);

            EditorGUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Fix now", GUILayout.MaxWidth(100), GUILayout.MinHeight(32)))
            {
                string assetPath = AssetDatabase.GetAssetPath(mesh);
                ModelImporter modelImporter = AssetImporter.GetAtPath(assetPath) as ModelImporter;
                if (modelImporter != null)
                {
                    modelImporter.isReadable = true;
                }
                modelImporter.SaveAndReimport();
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
        }

        public override void OnInspectorGUI()
        {

            serializedObject.UpdateIfRequiredOrScript();

            foreach (ObiColliderBase t in targets)
            {
                ObiMeshShapeTracker meshTracker = t.Tracker as ObiMeshShapeTracker;
                if (meshTracker != null)
                {
                    if (meshTracker.targetMesh != null && !meshTracker.targetMesh.isReadable)
                        NonReadableMeshWarning(meshTracker.targetMesh);
                }
            }

            var rect = EditorGUILayout.GetControlRect();
            var label = EditorGUI.BeginProperty(rect, new GUIContent("Collision category"), collisionFilter);
            rect = EditorGUI.PrefixLabel(rect, label);

            EditorGUI.BeginChangeCheck();
            var newCategory = EditorGUI.Popup(rect, ObiUtils.GetCategoryFromFilter(collider.Filter), ObiUtils.categoryNames);
            if (EditorGUI.EndChangeCheck())
            {
                foreach (ObiColliderBase t in targets)
                {
                    Undo.RecordObject(t, "Set collision category");
                    t.Filter = ObiUtils.MakeFilter(ObiUtils.GetMaskFromFilter(t.Filter), newCategory);
                    PrefabUtility.RecordPrefabInstancePropertyModifications(t);
                }
            }
            EditorGUI.EndProperty();

            rect = EditorGUILayout.GetControlRect();
            label = EditorGUI.BeginProperty(rect, new GUIContent("Collides with"), collisionFilter);
            rect = EditorGUI.PrefixLabel(rect, label);

            EditorGUI.BeginChangeCheck();
            var newMask = EditorGUI.MaskField(rect, ObiUtils.GetMaskFromFilter(collider.Filter), ObiUtils.categoryNames);
            if (EditorGUI.EndChangeCheck())
            {
                foreach (ObiColliderBase t in targets)
                {
                    Undo.RecordObject(t, "Set collision mask");
                    t.Filter = ObiUtils.MakeFilter(newMask, ObiUtils.GetCategoryFromFilter(t.Filter));
                    PrefabUtility.RecordPrefabInstancePropertyModifications(t);
                }
            }
            EditorGUI.EndProperty();

            DrawPropertiesExcluding(serializedObject, "m_Script", "CollisionMaterial", "filter", "Thickness", "Inverted");

            foreach (ObiColliderBase t in targets)
            {
                if (!t.gameObject.isStatic)
                    t.ForceUpdate();
            }

            // Apply changes to the serializedProperty
            if (GUI.changed)
            {
                serializedObject.ApplyModifiedProperties();
            }

        }

    }
}


